#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QTimer>  // 新增加定时器头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , tcpServer(nullptr)
    , clientSocket(nullptr)
    , isServerRunning(false)
    , isSending(false)  // 新增：标记是否正在发送指令
{
    ui->setupUi(this);
    setWindowTitle("TCP服务器控制中心");

    // 初始化始化消息显示区域
    appendMessage("欢迎使用TCP服务器控制中心");
    appendMessage("点击\"启动服务\"按钮开始监听客户端连接");
}

MainWindow::~MainWindow()
{
    // 关闭服务器和客户端连接
    if (clientSocket) {
        clientSocket->close();
        clientSocket->deleteLater();
    }
    if (tcpServer) {
        tcpServer->close();
        tcpServer->deleteLater();
    }
    delete ui;
}

// 向消息栏添加信息，带时间戳
void MainWindow::appendMessage(const QString &message)
{
    QString timeStr = QDateTime::currentDateTime().toString("[yyyy-MM-dd HH:mm:ss] ");
    ui->msgDisplay->append(timeStr + message);

    // 自动滚动到底部
    ui->msgDisplay->moveCursor(QTextCursor::End);
}

// 发送命令到客户端（核心修改部分）
void MainWindow::sendCommand(const QString &command)
{
    // 新增：防止重复发送，第一次点击后300ms内不响应新点击
    if (isSending) {
        appendMessage("提示：指令发送中，请稍候再试");
        return;
    }
    isSending = true;

    if (!isServerRunning) {
        appendMessage("错误：服务器未运行，请先启动服务");
        isSending = false;  // 恢复状态
        return;
    }

    if (!clientSocket || clientSocket->state() != QAbstractSocket::ConnectedState) {
        appendMessage("错误：未连接客户端，无法发送命令");
        isSending = false;  // 恢复状态
        return;
    }

    // 发送命令：添加换行符作为结束标志，确保客户端正确解析
    QByteArray sendData = (command + "\n").toUtf8();  // 新增：添加换行符
    qint64 bytesSent = clientSocket->write(sendData);

    // 新增：强制刷新缓冲区，确保数据立即发送
    clientSocket->flush();
    clientSocket->waitForBytesWritten(100);  // 等待数据发送完成

    if (bytesSent != -1) {
        appendMessage("发送命令：" + command);
    } else {
        appendMessage("发送失败：" + clientSocket->errorString());
    }

    // 新增：300ms后恢复发送状态，防止快速连续点击
    QTimer::singleShot(300, this, [this]() {
        isSending = false;
    });
}

// 新客户端连接处理（补充结束符）
void MainWindow::newClientConnected()
{
    // 如果已有客户端连接，则拒绝新连接
    if (clientSocket && clientSocket->state() == QAbstractSocket::ConnectedState) {
        QTcpSocket *newSocket = tcpServer->nextPendingConnection();
        appendMessage("已有客户端连接，拒绝新连接：" + newSocket->peerAddress().toString());
        newSocket->write("服务器已被其他客户端占用，请稍后再试\n");  // 新增：添加换行符
        newSocket->flush();
        newSocket->close();
        newSocket->deleteLater();
        return;
    }

    // 接受新连接
    clientSocket = tcpServer->nextPendingConnection();
    appendMessage("客户端已连接：" + clientSocket->peerAddress().toString() +
                  " 端口：" + QString::number(clientSocket->peerPort()));

    // 连接客户端信号
    connect(clientSocket, &QTcpSocket::disconnected, this, &MainWindow::clientDisconnected);
    connect(clientSocket, &QTcpSocket::readyRead, this, &MainWindow::readClientData);
    connect(clientSocket, &QTcpSocket::errorOccurred, [this](QAbstractSocket::SocketError ) {
        appendMessage("客户端错误：" + clientSocket->errorString());
    });
}

// 客户端断开连接处理
void MainWindow::clientDisconnected()
{
    if (clientSocket) {
        appendMessage("客户端已断开连接：" + clientSocket->peerAddress().toString());
        clientSocket->deleteLater();
        clientSocket = nullptr;
    }
}

// 读取客户端发送的数据
void MainWindow::readClientData()
{
    if (!clientSocket) return;

    QByteArray data = clientSocket->readAll();
    if (!data.isEmpty()) {
        appendMessage("收到客户端数据：" + QString(data));
    }
}

// 开灯按钮
void MainWindow::on_pushButton_clicked()
{
    sendCommand("Led open");
}

// 关灯按钮
void MainWindow::on_pushButton_2_clicked()
{
    sendCommand("Led close");
}

// 打开开蜂鸣器按钮
void MainWindow::on_pushButton_3_clicked()
{
    sendCommand("Beep open");
}

// 关闭蜂鸣器按钮
void MainWindow::on_pushButton_4_clicked()
{
    sendCommand("Beep close");
}

// 打开风扇按钮
void MainWindow::on_pushButton_5_clicked()
{
    sendCommand("Fan open");
}

// 关闭风扇按钮
void MainWindow::on_pushButton_6_clicked()
{
    sendCommand("Fan close");
}

// 打开马达按钮
void MainWindow::on_pushButton_7_clicked()
{
    sendCommand("Motor open");
}

// 关闭马达按钮
void MainWindow::on_pushButton_8_clicked()
{
    sendCommand("Motor close");
}

// 显示温度按钮
void MainWindow::on_pushButton_9_clicked()
{
    sendCommand("Display temperature");
}

// 显示湿度按钮
void MainWindow::on_pushButton_10_clicked()
{
    sendCommand("Display humidity");
}

// 站立按钮
void MainWindow::on_pushButton_11_clicked()
{
    sendCommand("Stand up");
}

// 趴下按钮
void MainWindow::on_pushButton_12_clicked()
{
    sendCommand("Get down");
}

// 前进按钮
void MainWindow::on_pushButton_13_clicked()
{
    sendCommand("Move forward");
}

// 后退按钮
void MainWindow::on_pushButton_14_clicked()
{
    sendCommand("Move back");
}

// 坐下按钮
void MainWindow::on_pushButton_15_clicked()
{
    sendCommand("Sit down");
}

// 停下按钮
void MainWindow::on_pushButton_16_clicked()
{
    sendCommand("Stop");
}

// 播放音乐按钮
void MainWindow::on_pushButton_17_clicked()
{
    sendCommand("Play music");
}

// 启动服务按钮
void MainWindow::on_pushButton_18_clicked()
{
    if (!isServerRunning) {
        // 启动服务器
        tcpServer = new QTcpServer(this);

        // 监听所有网络接口的8888端口
        if (tcpServer->listen(QHostAddress::Any, 8888)) {
            isServerRunning = true;
            appendMessage("服务器启动成功，监听端口：8888");
            appendMessage("等待客户端连接...");
            ui->pushButton_18->setText("停止服务");

            // 连接新客户端信号
            connect(tcpServer, &QTcpServer::newConnection, this, &MainWindow::newClientConnected);
        } else {
            appendMessage("服务器启动失败：" + tcpServer->errorString());
            delete tcpServer;
            tcpServer = nullptr;
        }
    } else {
        // 停止服务器
        if (tcpServer) {
            tcpServer->close();
            tcpServer->deleteLater();
            tcpServer = nullptr;
        }

        if (clientSocket) {
            clientSocket->close();
            clientSocket->deleteLater();
            clientSocket = nullptr;
        }

        isServerRunning = false;
        appendMessage("服务器已停止");
        ui->pushButton_18->setText("启动服务");
    }
}
